#include <exception>
#include <string>
#include <iostream>

using namespace std;

enum class errCode { defaultErr, serverErr, badErr };

class my_error : public exception
{
    public:
        my_error(): message("Error.") {}
        my_error(string str): message("Error: " + str) {}
        ~my_error() throw () {}
        virtual const char* what() const throw () {
            return message.c_str();
        }
        errCode status = errCode::defaultErr;
    private:
        string message;
};

class other_error : public my_error
{

};

int main()
{
    // 重新抛出
    try {
        throw my_error();
    }
    catch (my_error& e) {               // 引用类型
        e.status = errCode::serverErr;  // 修改了异常对象
        throw;                          // 异常对象的 status 成员是 serverErr
    }
    catch (other_error e) {             // 非引用类型
        e.status = errCode::badErr;     // 只修改了异常对象的局部副本
        throw;                          // 异常对象的 status 成员没有改变
    }

    // 使用省略号作为异常声明，表示捕获所有异常
    try {
        // 这里的操作将引发并抛出一个异常
    }
    catch (...) { // 如果与其他几个 catch 语句一起出现，则 catch (...) 必须在最后的位置
        // 处理异常的某些特殊操作
        throw;
    }
}